package com.sakiko.config;

import com.fasterxml.jackson.databind.ser.std.StringSerializer;
import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

/**
 * projectName: com.sakiko.config
 * todo: Redis Key和 Value序列化方式配置类
 *      默认序列方式: JdkSerializationRedisSerializer
 *      项目中一般选择: GenericJackson2JsonRedisSerializer
 *
 * @author: Yang
 * description: redisTemplate的一个配置类，设置序列化器，来避免 db中的字符 "乱码"
 * time: 2025/8/1 21:32
 */
@SpringBootConfiguration
public class RedisTemplateConfig {

    // todo: 这是为 test1写的，但是这样 setValueSerializer(RedisSerializer.string());
    //  但是这样 java.lang.ClassCastException: class java.util.ArrayList cannot be cast to
    //  class java.lang.String (java.util.ArrayList and java.lang.String are in module java.base of loader 'bootstrap')
//    @Bean
//    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
//        // 创建 RedisTemplate对象
//        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
//        // 设置连接工厂
//        redisTemplate.setConnectionFactory(redisConnectionFactory);
//        // 创建 JSON序列化工具
//        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
//                new GenericJackson2JsonRedisSerializer();
//        // 设置 Key的序列化
//        redisTemplate.setKeySerializer(RedisSerializer.string());
//        redisTemplate.setHashKeySerializer(jsonRedisSerializer);
//        // 设置 Value的序列化
//        redisTemplate.setValueSerializer(RedisSerializer.string());
//        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
//        // 立即生效
//        redisTemplate.afterPropertiesSet();
//        // 返回修改的模板对象
//        return redisTemplate;
//    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){
        // 创建RedisTemplate对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 设置连接工厂
        template.setConnectionFactory(connectionFactory);
        // 创建JSON序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer =
                new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化
        template.setKeySerializer(RedisSerializer.string());
        template.setHashKeySerializer(RedisSerializer.string());
        // 设置Value的序列化
        template.setValueSerializer(jsonRedisSerializer);
        template.setHashValueSerializer(jsonRedisSerializer);
        // 返回修改的模板对象
        return template;
    }
}
